package ch7.abs;

/**
 * <pre>
 * 
 *  1.使用abstract修饰的方法叫抽象方法，抽象方法没有方法体（没有大括号）
 *  2.一个类如果包含有抽象方法，则这个类必须是抽象类  
               注意：抽象类不一定包含抽象方法，即抽象类可以不包含抽象方法        
 *  3.在抽象类中，可以同时包含抽象方法和非抽象方法
 *  4.抽象类不能使用new关键词进行实例化
 *  5.子类必须实现或重写父类定义的抽象方法：
               即当需要子类重写或实现方法时，可以使用把特定的方法声明为抽象方法（对应的类就是抽象类）
 *  6.一个子类继承了一个抽象类，也会继承该父类的抽象方法
               如果父类包含有抽象方法，则子类必须实现该抽象方法（子类也是抽象类除外）
 *  
 * </pre>
 * 
 */

//使用abstract修饰的类叫抽象类，抽象类不能进行实例化
//final和abstract不能同时修饰类
//使用final修饰的类被称为终结类，终结类不能被继承，不能有子类
public abstract class AbstractClass {
	
	//使用final修饰的"变量"，称为常量
	//常量就是在运行过程中不能被修改的"变量"
	//属性常量需要在定义时需要初始化,常量一旦被初始化就不能被修改
	//属性常量如果在定义时没有进行初始化，则可以在构造方法中初始化一次
	private final int id;
	private final  String name;
	
	//类属性（使用static修饰的属性）必须在定义时进行初始化，一旦被初始化则不能被修改（引用不能被修改）
	public static final String MAN = "man";
	
	public AbstractClass() {
		super();
		// TODO Auto-generated constructor stub
		this.id=9;
		this.name="lily";
	}

	//final修饰的局部变量或参数，不能被修改
	public AbstractClass(final int id,final String name) {
		super();
		final int d;
		d = 12;
	    //d = 13; 错误，局部常量一旦被赋值，则不能进行修改
		
		this.id = id;
		this.name = name;
	}

	//抽象方法：修饰符号 abstract 返回值类型 方法名（参数列表）：- 没有方法体
	//抽象方法不能使用private关键词进行修饰，其他三个访问修饰符号可以
	//抽象方法不能使用static关键词进行修饰.
	//抽象方法不能使用final关键词进行修饰，final修饰的方法不能被重写
	public abstract void absMethod() ;
	
	//使用final修饰的方法称为终结方法，终结方法不能被重写
	public final void print() {
		System.out.println("xxx");
	}

	public static void main(String[] args) {
		
		//抽象类一般由非抽象的子类进行实例化，多态编程
		AbstractClass bAbstractClass =new SubAbstractClass();
		bAbstractClass.absMethod();
	}
}
